package com.yonyou.cyxdms.sysAuth.service.service;


import java.util.List;
import java.util.Map;
import java.util.Set;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yonyou.cyx.framework.service.base.ICommonService;
import com.yonyou.cyxdms.framework.bean.dto.user_info.LoginInfoDto;
import com.yonyou.cyxdms.sysAuth.service.dto.role.RolePDto;
import com.yonyou.cyxdms.sysAuth.service.dto.user.*;
import com.yonyou.cyxdms.sysAuth.service.entity.UserPO;
import com.yonyou.cyxdms.sysAuth.service.entity.cms.GetUserInfoByjwtVO;
import com.yonyou.cyxdms.sysAuth.service.vo.employee.EmployeeAddVO;
import com.yonyou.cyxdms.sysAuth.service.vo.user.*;
import com.yonyou.cyxdms.sysmanage.client.domains.dto.UserDictDto;
import com.yonyou.cyxdms.sysmanage.client.vo.employee.UserInfoVO;

/**
 * <p>
 * 账号信息 服务类
 * </p>
 *
 * @author zhangxianchao
 * @since 2018-09-13
 */
public interface UserService extends ICommonService<UserDTO, UserPO, Long> {

    /**
     * 根据租户及账号信息获取用户信息
     *
     * @param appId
     * @param userCode
     * @return com.yonyou.cyx.framework.bean.dto.user_info.LoginInfoDto
     * @author zhangxianchao
     * @since 2018/9/14 0014
     */
    public LoginInfoDto getUserInfoByUserCode(String appId, String userCode);

    /**
     * 根据EmpID 来删除用户
     *
     * @param empId
     * @return void
     * @author zhangxianchao
     * @since 2018/9/23 0023
     */
    public int deleteUserByEmpId(Long empId);

    /**
     * 根据EmpID 来删除用户
     *
     * @param empIds
     * @return void
     * @author zhangxianchao
     * @since 2018/9/23 0023
     */
    public int deleteUserByBatchEmpIds(List<Long> empIds);

    /**
     * 登陆校验-根据账号密码
     *
     * @return
     */
    public UserInfoDto viliateUserPass(LoginDto loginDto);

    /**
     * 通过userCode apid获取userID
     *
     * @param userCode
     * @param appId
     * @return java.lang.Long
     * @author zhangsx
     * @since 2018/11/8
     */
    public Long getUserInfoByParams(String userCode, String appId);

    public Long syncUser(SyncUserDTO syncUserDTO);

    /**
     * 更新用戶信息
     *
     * @param updateUserInfoDTO
     * @return
     */
    Boolean updateUserInfo(UpdateUserInfoDTO updateUserInfoDTO);

    /**
     * 更新用戶密码
     *
     * @param updatePasswordDTO
     * @return
     */
    Boolean updatePassword(UpdatePasswordDTO updatePasswordDTO);


    /**
     * 根据用户ID查询dealerId
     *
     * @param userId
     * @return
     */
    Long getDealerId(Long userId);

    Integer getDealerIdByDealerCode(String dealerCode);


    String getDealerCodeByDealerId(Integer dealerId);

    Map<String, Object> userDataVue(String employeeId, String dataSource);

    /**
     * 查询登录用户信息
     *
     * @return
     * @author 李贺
     * @date 2019年9月18日
     */
    EmployeeAddVO findByEmployeeId();

    Long editpassword(UserVO userDto);

    RolePDto modifyOrg(RolePDto RolePDto);

    Integer getuseridbyemployeeid(Long employeeId);

    /**
     * @author ：quankk
     * @date ：2019/7/18 15:21
     * @description：用户密码查询查询用户信息
     */
    IPage<UserInfosVO> searchUserInfos(Page<UserInfosVO> page, Map<String, String> param);

    /**
     * @author ：quankk
     * @date ：2019/7/18 16:01
     * @description：修改密码
     */
    void editPassword(UserEditPassword userEditPassword);

    /**
     * @author ：quankk
     * @date ：2019/7/18 16:20
     * @description：重置密码
     */
    void restPassword(UserEditPassword userEditPassword);

    void updateEmpById(Long id, List<String> employeeRoles);


    /**
     * @author ：MAXINGJIAN
     * @date ：2019/7/19
     * @description：保存tc_USER
     */
    void insertTcUser(String userCode);

    /**
     * @author ：MAXINGJIAN
     * @date ：2019/7/19
     * @description：更新emp表和employee表
     */
    void updateEmpAndEmployee(Long employeeId, String userCode);

    Long supereditpassword(UserVO userDto);


    UserDictDto getUserById(Long userId);

    public LoginInfoDto getUserInfoByUserId(String appId, Long userId);


    /**
     * 根据角色类别获取用户
     *
     * @param role 角色类别
     * @return 用户
     * @author 李贺
     * @date 2019年9月4日
     */
    List<UserAndRoleDTO> getUserListByRole(Integer role);

    List<UserAndRoleClaimDTO> getUserListByRoleClaim(String role);

    LoginInfoDto getAppUserInfo(String appId, String token, String userAgent);

    /**
     * 新增user
     *
     * @author 李贺
     * @date 2019年9月11日
     */
    void addUser(UserPO userpo);


    UserInfoVO getUserInfoByUserId(Long userId);

    List<UserInfoVO> getUserInfoList(Set<String> userIdSet);

    /**
     * 根据用户的userOrgId 查询用户权限
     *
     * @author 李贺
     * @date 2019年9月23日
     */
    Map<String, Object> userPermission(Long userOrgId, String dataSource);

    /**
     * @author ：李贺
     * @date ：2019/9/24
     * @description：重置密码
     */
    void resetPassword(String employeeNo, String passWord);


    public IPage<UserInfoVO> getUserInfoByParams2(Page<UserInfoVO> page, UserParamDTO userParamDTO);

    public Map<String, List<UserPermissionActionListDTO>> getUserPermissionAction();

    List<com.yonyou.cyxdms.sysmanage.client.vo.user.UserInfoVO> getUsersByPosition(Long menuId, List<Integer> positionCodes, String userPhone);

    List<com.yonyou.cyxdms.sysmanage.client.vo.user.UserInfoVO> getUsersByManager(Long menuId, List<Integer> positionCodes, String userPhone);

    List<DealerUserVO> getDealerUser();

    Integer getAppPosition();

    /**
     * 根据userId和userOrgId返回角色类别
     *
     * @date 2019-10-28  adu
     */
    Map<String, Object> getRoleTypeParams(Integer userId, Integer orgId);

    /**
     * @author ：maxingjian
     * @date ：2019/11/06
     * @description：获取用户的个人参数配置
     */
    Map<String, List<String>> getUserPermissionCtrl();

    /**
     * 将所有的failureNum改为0
     *
     * @author 李贺
     * @date 2019年11月19日
     */
    Long updateFailureNum();

    /**
     * 获取用户数量
     *
     * @author MAXINGJIAN
     * @date 2019年11月20日
     */
    Long getUserCount();

    /**
     * 通过userid获取经理的userid
     *
     * @author maxingjian
     * @date 2019年11月22日
     */
    List<String> getManagerIdByUserId(String userId, String positionCode, String orgId);

    /**
     * 根据userName获得userId
     */
    List<Long> getUserIdByName(String appId, String ownerCode, String name);

    UserDTO getUserIdByUserCode(String userCode, String appId);

    /**
     * 获取所有人员（翻译用）
     *
     * @author maxingjian
     * @date 2019年12月31日
     */
    List<CompanyUserVO> getAllUser();


    String getPositionCodeByUserOrgId(Long userOrgId);

    List<UserRoleVO> getRoleInfoByCompanyId(String companyId, String appId);

    List<String> getUserIdByMenuId(String menuId, String appId, String userId, String userCode);

    void sendConsultant();

    List<Long> getUserIdByNameAndPositionCode(String appId, String ownerCode, String name);

    UserDictDto getuserbyidcms(Long userId);

    GetUserInfoByjwtVO getuserinfobyuid(String userId);

    UserDictDto getuserbyidcmsnew(Long userId, String userOrgId);

    List<UserEmpVO> getNameByIds(String userIds);

    List<UserEmpVO> findUserByRole(String roleCode, String roleId, String ownerCode, String companyId, String appId);

    Integer checkEmployeeStatus(String appId, Long userId);

    List<UserEmpVO> getNameByAppId(String appId);
}
